<?php
/**
 * 浏览器友好的变量输出
 *
 * @param mixed $var
 *        	变量
 * @param boolean $echo
 *        	是否输出 默认为True 如果为false 则返回输出字符串
 * @param string $label
 *        	标签 默认为空
 * @param boolean $strict
 *        	是否严谨 默认为true
 * @return void string
 */
function dump($var, $echo = true, $label = null, $strict = FALSE) {
	$label = ($label === null) ? '' : rtrim ( $label ) . ' ';
	if (! $strict) {
		if (ini_get ( 'html_errors' )) {
			$output = print_r ( $var, true );
			$output = '<pre>' . $label . htmlspecialchars ( $output, ENT_QUOTES ) . '</pre>';
		} else {
			$output = $label . print_r ( $var, true );
		}
	} else {
		ob_start ();
		var_dump ( $var );
		$output = ob_get_clean ();
		if (! extension_loaded ( 'xdebug' )) {
			$output = preg_replace ( '/\]\=\>\n(\s+)/m', '] => ', $output );
			$output = '<pre>' . $label . htmlspecialchars ( $output, ENT_QUOTES ) . '</pre>';
		}
	}
	if ($echo) {
		echo ($output);
		return null;
	} else
		return $output;
}
function JsMessage($message, $URL = 'HISTORY', $charset = 'utf-8') {
	echo '
			<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
			<html xmlns="http://www.w3.org/1999/xhtml">
			<head>
			<meta http-equiv="Content-Type" content="text/html; charset=' . $charset . '" />
			<title>系统提示</title>
			</head>

			<body>
			<script type="text/javascript">
			alert("' . $message . '");
			' . (strtoupper ( $URL ) == 'HISTORY' ? 'history.back();' : 'location.href="' . $URL . '";') . '
			</script>
			</body>
			</html>
		';
	exit ();
}
function _mkdir($dir) {
	if (! is_dir ( $dir )) {
		$temp = explode ( '/', $dir );
		$cur_dir = '';
		for($i = 0; $i < count ( $temp ); $i ++) {
			$cur_dir .= $temp [$i] . '/';
			if (! is_dir ( $cur_dir )) {
				@mkdir ( $cur_dir, 0777 );
			}
		}
	}
}
/**
 * 对查询结果集进行排序
 * @access public
 * @param array $list 查询结果
 * @param string $field 排序的字段名
 * @param array $sortby 排序类型
 * asc正向排序 desc逆向排序 nat自然排序
 * @return array
 */
function list_sort_by($list,$field, $sortby='asc') {
    if(is_array($list)){
        $refer = $resultSet = array();
        foreach ($list as $i => $data)
            $refer[$i] = &$data[$field];
        switch ($sortby) {
            case 'asc': // 正向排序
                asort($refer);
                break;
            case 'desc':// 逆向排序
                arsort($refer);
                break;
            case 'nat': // 自然排序
                natcasesort($refer);
                break;
        }
        foreach ( $refer as $key=> $val)
            $resultSet[] = &$list[$key];
        return $resultSet;
    }
    return false;
}
/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent标记字段
 * @param string $level level标记字段
 * @return array
 * @author 陈德本 <heanup@vip.qq.com>
 */
function list_to_tree($list, $pk='id', $pid = 'pid', $child = '_child', $root = 0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId =  $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * 将list_to_tree的树还原成列表
 * @param  array $tree  原来的树
 * @param  string $child 孩子节点的键
 * @param  string $order 排序显示的键，一般是主键 升序排列
 * @param  array  $list  过渡用的中间数组，
 * @return array        返回排过序的列表数组
 * @author yangweijie <yangweijiester@gmail.com>
 */
function tree_to_list($tree, $child = '_child', $order='id', &$list = array()){
    if(is_array($tree)) {
        $refer = array();
        foreach ($tree as $key => $value) {
            $reffer = $value;
            if(isset($reffer[$child])){
                unset($reffer[$child]);
                tree_to_list($value[$child], $child, $order, $list);
            }
            $list[] = $reffer;
        }
        $list = list_sort_by($list, $order, $sortby='asc');
    }
    return $list;
}

function utf8_substr($str, $Length, $Append = false)
{
    $str = htmlspecialchars_decode($str);
//     $str = strip_tags($str);
    $str = trim($str);
    return mb_substr($str, 0, $Length, 'utf-8');
}
/**
 * 字节格式化 把字节数格式为 B K M G T 描述的大小
 * @param int $size
 * @param number $dec
 * @return string
 */
function byte_format($size, $dec=2)
{
    $a = array("B", "KB", "MB", "GB", "TB", "PB");
    $pos = 0;
    while ($size >= 1024) {
        $size /= 1024;
        $pos++;
    }
    return round($size,$dec)." ".$a[$pos];
}
function writeLog($msg, $name, $dir = '') {
	if (empty ( $dir )) {
		$dir = 'log/' . date ( 'Ymd' ) . '/';
	}
	_mkdir ( $dir );
	$tmpfile = $dir . $name . ".log";
	$fd = fopen ( $tmpfile, "a" );
	fwrite ( $fd, $msg );
	fclose ( $fd );
}
function htmlSubString($content, $maxlen = 300)
{
    // 把字符按HTML标签变成数组。
    $content = preg_split("/(<[^>]+?>)/si", $content, - 1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    $wordrows = 0; // 中英字数
    $outstr = ""; // 生成的字串
    $wordend = false; // 是否符合最大的长度
    $beginTags = 0; // 除<img><br><hr>这些短标签外，其它计算开始标签，如<div*>
    $endTags = 0; // 计算结尾标签，如</div>，如果$beginTags==$endTags表示标签数目相对称，可以退出循环。
    // print_r($content);
    foreach ($content as $value) {
        if (trim($value) == "")
            continue; // 如果该值为空，则继续下一个值
        if (strpos(";$value", "<") > 0) {
            // 如果与要载取的标签相同，则到处结束截取。
            if (trim($value) == $maxlen) {
                $wordend = true;
                continue;
            }
            if ($wordend == false) {
                $outstr .= $value;
                if (! preg_match("/<img([^>]+?)>/is", $value) && ! preg_match("/<param([^>]+?)>/is", $value) && ! preg_match("/<!([^>]+?)>/is", $value) && ! preg_match("/<br([^>]+?)>/is", $value) && ! preg_match("/<hr([^>]+?)>/is", $value)) {
                    $beginTags ++; // 除img,br,hr外的标签都加1
                }
            } else
                if (preg_match("/<\/([^>]+?)>/is", $value, $matches)) {
                    $endTags ++;
                    $outstr .= $value;
                    if ($beginTags == $endTags && $wordend == true)
                        break; // 字已载完了，并且标签数相称，就可以退出循环。
                } else {
                    if (! preg_match("/<img([^>]+?)>/is", $value) && ! preg_match("/<param([^>]+?)>/is", $value) && ! preg_match("/<!([^>]+?)>/is", $value) && ! preg_match("/<br([^>]+?)>/is", $value) && ! preg_match("/<hr([^>]+?)>/is", $value)) {
                        $beginTags ++; // 除img,br,hr外的标签都加1
                        $outstr .= $value;
                    }
                }
        } else {
            if (is_numeric($maxlen)) { // 截取字数
                $curLength = getStringLength($value);
                $maxLength = $curLength + $wordrows;
                if ($wordend == false) {
                    if ($maxLength > $maxlen) { // 总字数大于要截取的字数，要在该行要截取
                        $outstr .= subString($value, 0, $maxlen - $wordrows);
                        $wordend = true;
                    } else {
                        $wordrows = $maxLength;
                        $outstr .= $value;
                    }
                }
            } else {
                if ($wordend == false)
                    $outstr .= $value;
            }
        }
    }
    // 循环替换掉多余的标签，如<p></p>这一类
    while (preg_match("/<([^\/][^>]*?)><\/([^>]+?)>/is", $outstr)) {
        $outstr = preg_replace_callback("/<([^\/][^>]*?)><\/([^>]+?)>/is", "strip_empty_html", $outstr);
    }
    // 把误换的标签换回来
    if (strpos(";" . $outstr, "[html_") > 0) {
        $outstr = str_replace("[html_&lt;]", "<", $outstr);
        $outstr = str_replace("[html_&gt;]", ">", $outstr);
    }
    // echo htmlspecialchars($outstr);
    return $outstr;
}
// 去掉多余的空标签
function strip_empty_html($matches)
{
    $arr_tags1 = explode(" ", $matches[1]);
    if ($arr_tags1[0] == $matches[2]) { // 如果前后标签相同，则替换为空。
        return "";
    } else {
        $matches[0] = str_replace("<", "[html_&lt;]", $matches[0]);
        $matches[0] = str_replace(">", "[html_&gt;]", $matches[0]);
        return $matches[0];
    }
}
// 取得字符串的长度，包括中英文。
function getStringLength($text)
{
    if (function_exists('mb_substr')) {
        $length = mb_strlen($text, 'UTF-8');
    } elseif (function_exists('iconv_substr')) {
        $length = iconv_strlen($text, 'UTF-8');
    } else {
        preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $text, $ar);
        $length = count($ar[0]);
    }
    return $length;
}

/**
 * *********按一定长度截取字符串（包括中文）********
 */
function subString($text, $start = 0, $limit = 12)
{
    if (function_exists('mb_substr')) {
        $more = (mb_strlen($text, 'UTF-8') > $limit) ? TRUE : FALSE;
        $text = mb_substr($text, 0, $limit, 'UTF-8');
        return $text;
    } elseif (function_exists('iconv_substr')) {
        $more = (iconv_strlen($text, 'UTF-8') > $limit) ? TRUE : FALSE;
        $text = iconv_substr($text, 0, $limit, 'UTF-8');
        // return array($text, $more);
        return $text;
    } else {
        preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $text, $ar);
        if (func_num_args() >= 3) {
            if (count($ar[0]) > $limit) {
                $more = TRUE;
                $text = join("", array_slice($ar[0], 0, $limit));
            } else {
                $more = FALSE;
                $text = join("", array_slice($ar[0], 0, $limit));
            }
        } else {
            $more = FALSE;
            $text = join("", array_slice($ar[0], 0));
        }
        return $text;
    }
}
?>